package org.rqb.panel.partPanel;

import lombok.extern.slf4j.Slf4j;
import org.rqb.frame.MyFrame;
import org.rqb.panel.ProxySettingPanel;
import org.rqb.panel.RepeatPanel;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

@Slf4j
public class TitlePanel extends JPanel implements ActionListener {
    private JPanel cardPanel;
    private CardLayout cardLayout;
    private RepeatPanel repeatPanel;
    private MyFrame myFrame;

    private JPopupMenu settingsMenu;  // 设置菜单
    private SetPanel setPanel = new SetPanel(myFrame);


    public TitlePanel(MyFrame myFrame,JPanel cardPanel, CardLayout cardLayout,RepeatPanel repeatPanel) {
        this.myFrame = myFrame;
        this.cardPanel = cardPanel;
        this.cardLayout = cardLayout;
        this.repeatPanel = repeatPanel;
        this.setPanel = new SetPanel(this.myFrame);

        layoutInit();
        menuInit();  // 初始化设置按钮的菜单
    }

    private void layoutInit() {
        this.setLayout(new BorderLayout());

        // 创建一个 JPanel，用于存放按钮，使用 FlowLayout 并设置按钮间距
        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 20, 10)); // 20 是按钮间的水平间隔，10 是按钮到容器边缘的垂直间隔

        // 创建按钮
        JButton homeBtn = new JButton("首页");
        JButton setBtn = new JButton("设置");

        menuBarInit(homeBtn);
        menuBarInit(setBtn);

        // 将按钮添加到 panel 中
        buttonPanel.add(homeBtn);
        buttonPanel.add(setBtn);

        // 将按钮面板添加到主面板
        this.add(buttonPanel, BorderLayout.NORTH);  // 添加到面板顶部
    }

    // 初始化设置菜单
    private void menuInit() {
        settingsMenu = new JPopupMenu();  // 创建弹出菜单

        JMenuItem item1 = new JMenuItem("基本参数设置");
        JMenuItem item2 = new JMenuItem("代理设置");
        JMenuItem item3 = new JMenuItem("选项3");

        // 为每个菜单项添加动作监听器
        item1.addActionListener(this);
        item2.addActionListener(this);
        item3.addActionListener(e -> log.info("选项3 被点击"));

        // 将菜单项添加到菜单中
        settingsMenu.add(item1);
        settingsMenu.add(item2);
        settingsMenu.add(item3);
    }

    private void menuBarInit(JButton btn) {
        btn.setOpaque(false);  // 背景透明
        btn.setContentAreaFilled(false);  // 去掉内容填充
        btn.setBorder(null);  // 移除边框
        btn.setForeground(Color.BLACK);  // 设置初始字体颜色

        // 添加鼠标事件监听器，改变样式
        btn.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                btn.setForeground(Color.BLUE);  // 鼠标悬停时改变字体颜色
            }

            @Override
            public void mouseExited(MouseEvent e) {
                btn.setForeground(Color.BLACK);  // 鼠标离开时恢复默认颜色
            }
        });

        btn.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() instanceof JButton) {  //首页或这设置按钮被点击
            JButton button = (JButton) e.getSource();
            switch (button.getText()) {
                case "首页" :
                    recoverMenuPanel();
                    break;
                case "设置" :
                    log.info("设置按钮被点击");
                    setBtnOnclick(button);  // 将按钮传入
                    break;
            }
        }else if (e.getSource() instanceof JMenuItem) { // 表示菜单按钮被点击
            JMenuItem item = (JMenuItem) e.getSource();
            switch (item.getText()){
                case "基本参数设置" :
                    log.info("基本参数设置被点击");
                    showSettingsDialog();  // 显示设置对话框
                    break;

                case "代理设置":
                    log.info("代理设置被点击");
                    showProxySettingDialog(); //显示代理设置对话框
                    break;

            }
        }
    }


    private void setBtnOnclick(JButton button) {
        // 在按钮的相对位置显示弹出菜单
        settingsMenu.show(button, button.getWidth() / 2, button.getHeight());
    }


    /**
     * 显示代理设置对话框
     */
    private void showProxySettingDialog() {
        JDialog dialog = new JDialog(myFrame, "代理设置", true);
        dialog.setContentPane(new ProxySettingPanel(myFrame));
        dialog.pack();
        dialog.setLocationRelativeTo(myFrame);
        dialog.setVisible(true);

    }

    /**
     * 基本参数设置被点击的时候，显示设置对话框
     */
    private void showSettingsDialog() {

        // 创建一个带有确认和取消按钮的对话框，内容是自定义的 settingsPanel
        int result = JOptionPane.showConfirmDialog(
                this,  // 父组件
                setPanel,  // 显示的自定义内容面板
                "基本参数设置",  // 对话框标题
                JOptionPane.OK_CANCEL_OPTION,  // 显示“确认”和“取消”按钮
                JOptionPane.PLAIN_MESSAGE  // 对话框的样式
        );

        // 根据用户选择的按钮进行处理
        if (result == JOptionPane.OK_OPTION) {
            // 如果用户点击了“确认”按钮
            log.info("用户点击了确认按钮");

            // 更新配置文件
            setPanel.updateConfig();


        } else if (result == JOptionPane.CANCEL_OPTION) {
            // 如果用户点击了“取消”按钮
            log.info("用户点击了取消按钮");
        }
    }



    private void recoverMenuPanel() {
        //移除复现页面的鼠标和键盘监听器
        repeatPanel.stopRecordListener();
        //跳转到首页
        cardLayout.show(cardPanel, "menuPanel");
    }
}
